home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
msdos
/
let
/
let.y
< prev
Wrap
Text File
|
1991-10-18
|
5KB
|
201 lines
%{
/*
電卓プログラム(環境変数対応) by Y.Kurihara (Nifty PDC01620)
Ver 0.01 1991.06.23
Ver 0.02 1991.07.28
使用できる演算子('<','>'の変わりに'{','}'を使用する)
+ - * / () , = += -= *= /= ++ --
== != { } {= ={ }= =} & | && || ~ !
使用したプログラム
LSI C-86 Ver 3.20 試食版 (C-MAGAZINE 付録)
KM-yacc ver 2.0 (C-MAGAZINE 付録)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <dos.h>
#include <environ.h>
#define YYSTYPE long
long ret;
int cenv,renv;
char *cmd;
long putval( long ptr,long val );
long getval( long ptr );
%}
%token NUM,VAR
%token '(',')',',','\0','\n'
%left ','
%right '=',PLE,MIE,MUE,DIE
%left AND,OR
%left '{','}',LE,GE,EQ,NE
%left '+','-'
%left '*','/'
%left '&','|'
%right MINUS,'!','~'
%nonassoc PP,MM
%%
line :
| line expr '\n' { ret = $2; }
| line error '\n' { yyerrok; }
;
expr : VAR '=' expr { $$ = putval( $1,$3 ); }
| VAR PP { $$ = putval( $1,getval( $1 )+ 1 )- 1; }
| VAR MM { $$ = putval( $1,getval( $1 )- 1 )+ 1; }
| PP VAR { $$ = putval( $2,getval( $2 )+ 1 ); }
| MM VAR { $$ = putval( $2,getval( $2 )- 1 ); }
| VAR PLE expr { $$ = putval( $1,getval( $1 )+ $3 ); }
| VAR MIE expr { $$ = putval( $1,getval( $1 )- $3 ); }
| VAR MUE expr { $$ = putval( $1,getval( $1 )* $3 ); }
| VAR DIE expr { if( $3 == 0 ) $3 = 1;
$$ = putval( $1,getval( $1 )/ $3 ); }
| expr ',' expr { $$ = $3; }
| expr AND expr { $$ = $1 && $3; }
| expr OR expr { $$ = $1 || $3; }
| expr EQ expr { $$ = $1 == $3; }
| expr NE expr { $$ = $1 != $3; }
| expr '}' expr { $$ = $1 > $3; }
| expr '{' expr { $$ = $1 < $3; }
| expr GE expr { $$ = $1 >= $3; }
| expr LE expr { $$ = $1 <= $3; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { if( $3 == 0 ) $3 = 1;
$$ = $1 / $3; }
| expr '&' expr { $$ = $1 & $3; }
| expr '|' expr { $$ = $1 | $3; }
| '(' expr ')' { $$ = $2; }
| NUM { $$ = $1; }
| VAR { $$ = getval( $1 ); }
| '-' expr %prec MINUS { $$ = - $2; }
| '!' expr { $$ = ! $2; }
| '~' expr { $$ = ~ $2; }
;
%%
int yylex()
{
int c;
char buff[128];
while( ( c = *cmd++ )== ' ' || c == '\t' );
if( isdigit( c ) ) {
int n = 0;
do {
n = n * 10 + c - '0';
c = *cmd++;
} while( isdigit( c ) );
cmd--;
yylval = n;
return( NUM );
}
if( isalpha( c ) ) {
char *p = buff;
do {
*p++ = c;
c = *cmd++;
} while( isalnum( c ) );
cmd--;
*p = 0;
yylval = (long)strdup( buff );
return( VAR );
}
if( c > ' ' ) {
int c2 = *cmd++;
if( c == '&' && c2 == '&' ) return( AND );
if( c == '|' && c2 == '|' ) return( OR );
if( c == '=' && c2 == '=' ) return( EQ );
if( c == '!' && c2 == '=' ) return( NE );
if( c == '}' && c2 == '=' ) return( GE );
if( c == '=' && c2 == '}' ) return( GE );
if( c == '{' && c2 == '=' ) return( LE );
if( c == '=' && c2 == '{' ) return( LE );
if( c == '+' && c2 == '+' ) return( PP );
if( c == '-' && c2 == '-' ) return( MM );
if( c == '+' && c2 == '=' ) return( PLE );
if( c == '-' && c2 == '=' ) return( MIE );
if( c == '*' && c2 == '=' ) return( MUE );
if( c == '/' && c2 == '=' ) return( DIE );
cmd--;
}
return( c );
}
int yyerror( char *s )
{
fprintf( stderr,"%s\n",s );
return( 0 );
}
char *getcmd( void )
{
static char buff[ 128 ];
char far *ptr,*p = buff;
int n;
ptr = MK_FP( _psp,0x80 );
n = *ptr++;
while( n-- > 0 ) *p++ = *ptr++;
*p++ = '\n';
*p = 0;
return( buff );
}
char *int2str( char *str,int num )
{
if( num < 0 ) {
*str++ = '-';
num = -num;
}
if( num > 9 ) str = int2str( str,num / 10 );
*str++ = num % 10 + '0';
*str = 0;
return( str );
}
long getval( long ptr )
{
char *p;
if( isupper( *(char*)ptr ) ) {
p = envget( (char*)ptr,cenv );
} else {
p = envget( (char*)ptr,renv );
}
if( p ) return( atoi( p ) );
return( 0 );
}
long putval( long ptr,long val )
{
char buff[ 10 ];
int2str( buff,val );
if( isupper( *(char*)ptr ) ) {
envset( (char*)ptr,buff,cenv );
} else {
envset( (char*)ptr,buff,renv );
}
return( val );
}
void main()
{
cmd = getcmd();
renv = pspenv( getrpid() );
cenv = pspenv( getcpid() );
yyparse();
if( ret < 0 || ret > 255 ) ret = 255;
printf( "%d",ret );
exit( ret );
}